﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Services;
using Controladores;
using Entidades.jSON.Sistema;
using Web.Extensions;
using Web.Helpers;
using Entidades;
using Common;
using Web.Helpers.jqGridHelpers;

namespace Web.Pages
{
    public partial class Liquidacion : BasePage
    {
        #region Private Members
        private int _idGuion;
        #endregion

        #region Events

        protected new void Page_Load(object sender, EventArgs e)
        {
            base.Page_Load(sender, e);

            if (!Page.IsPostBack)
            {
                _idGuion = Helpers.WebHelper.Pages.QueryString.GetParameter<Int32>(Common.WellKnownKeys.Page.Parameters.ID_GUION);

                this.CargarPagina(_idGuion);
            }
        }

        #endregion

        #region Private Methods

        private void CargarPagina(int idGuion)
        {
            var currentUser = SessionHelper.GetCurrentUser();
            if (currentUser == null)
                return;

            var idUsuario = ValidarPermisosAdmin(currentUser) ? WellKnownKeys.Entities.DEFAULT_ID : currentUser.Id;

            CargarListaProyectos(idUsuario);
            if ( idGuion > 0 )
            {
                var guion = new ControladorBase<Guion>().ObtenerEntidad(x => x.Id == idGuion);
                if (guion.IsNotNull())
                {
                    if (guion.Proyecto != null)
                    {
                        CargarListaGuiones(guion.Proyecto.Id, idUsuario);
                        this.selLiquidacion_Proyecto.SetSelected(guion.Proyecto.Id);
                        this.selLiquidacion_Guion.SetSelected(guion.Id);
                    }
                }
            }
        }

        private void CargarListaProyectos(int? idUsuario = null)
        {
            var proyectos = new ProyectoControlador().ObtenerProyectos(idUsuario);
            var proyectosInfo =
                proyectos.Select
                (
                    proyecto => new ListaInfo() { Id = proyecto.Id, Texto = proyecto.Nombre }
                ).ToList();
            this.selLiquidacion_Proyecto.Bind(proyectosInfo, "Id", "Texto");
        }

        private void CargarListaGuiones(int idProyecto, int? idUsuario = null)
        {
            var guionesInfo = ObtenerListaGuiones(idProyecto, idUsuario);
            this.selLiquidacion_Guion.Bind(guionesInfo, "Id", "Texto");
        }

        private static List<ListaInfo> ObtenerListaGuiones(int idProyecto, int? idUsuario = null)
        {
            List<ListaInfo> guionesInfo = null;
            var guiones = new GuionControlador().ObtenerGuiones(idUsuario, idProyecto);
            if (guiones.IsNotNull())
            {
                guionesInfo =
                    guiones.Select
                        (
                            guion =>
                                new ListaInfo()
                                {
                                    Id      = guion.Id,
                                    Texto   = String.Format("Ep. {0} - {1}", guion.Episodio, guion.Titulo)
                                }
                        ).ToList();
            }
            return guionesInfo;
        }

        #endregion

        #region Web Methods

        [WebMethod]
        public static string obtenerPagosGuion(int pageSize, int currentPage, string sortColumn, string sortOrder, string search, string searchFilter, string colModel, bool isExport)
        {
            var jSON = string.Empty;
            try
            {
                var gridData = new GridDataHelper<Pago>().GetData(searchFilter, colModel, currentPage, pageSize, sortOrder, sortColumn);

                #region Construir set de datos
                var lista = from Pago item in gridData.Data
                            select new object[]
                            {
                                item.Id,
                                item.Guion.Id,
                                BasePage.CrearBoton("GenerarReclamo", "Guion", item.Guion.Id,WellKnownKeys.Images.Icons.RECLAMAR),
                                item.Guion.Episodio,                                                    
                                BasePage.CrearLink(WellKnownKeys.Grid.Actions.EDITAR + "Guion", item.Guion.Id, item.Guion.Titulo),
                                item.Proveedor.Id,
                                item.Proveedor.Tipo.Nombre,
                                BasePage.CrearLink(WellKnownKeys.Grid.Actions.VER + "Proveedor", item.Proveedor.Id, BasePage.MostrarNombreCompleto(item.Proveedor)),
                                item.ProveedorRol.Id,
                                item.ProveedorRol.Nombre,
                                item.Fecha,
                                item.Loops,
                                item.ImporteTotal
                            };
                var jqGridData = new jqGridData(gridData.TotalRecords, gridData.TotalPages, gridData.CurrentPage, lista);
                #endregion

                jSON = Formatter.JSON<jqGridData>.Serialize(jqGridData);
            }
            catch (Exception ex)
            {
                LogError(ex);
                throw;
                //string detalleError = ex.Message;
                //jSON = Formatter.jSON.convertirEnJSON(new Helpers.jqGridHelpers.jqGridData(0, 0, 1, null));
            }
            return jSON;
        }

        [WebMethod]
        public static string obtenerGuiones(int idProyecto)
        {
            var mensaje     = string.Empty;
            var resultado   = false;
            object valor    = null;
            try
            {
                var currentUser = SessionHelper.GetCurrentUser();
                var idUsuario = ValidarPermisosAdmin(currentUser) ? new int?() : currentUser.Id;

                var guionesInfo = ObtenerListaGuiones(idProyecto, idUsuario);
        
                mensaje     = "Guiones obtenidos exitosamente.";
                resultado   = true;
                valor       = guionesInfo;
            }
            catch (Exception ex)
            {
                LogError(ex);
                //throw ex;
                mensaje = "Hubo un error al intentar guardar los datos del Guión." + Environment.NewLine + ex.Message;
            }
            return SessionHelper.BuildResponse(mensaje, resultado, valor);      
        }

        #endregion

    }
}